perm filename VLISP.DOC[VLI,LSP] blob
sn#383730 filedate 1978-09-26 generic text, type T, neo UTF8
VLISP 10 . 3
3-Sep-78 [JER]
Le PRETTY.PRINT a ete transforme pour pourvoir editer
les fonctions LIST NCONS MCONS et CONS en notation [ ... ].
cf: la note du 29-Aout-78 [PAT].
Ya 2 images memoires sur SYS: VPRETTY ET VINDEX donc
.R VPRETTY joue un Pretty-Cross compile
.R VINDEX joue un INDEX compile.
2-Sep-78 [JER]
HOURRA. Les CONS ne testent plus la fin de la liste
libre. C'est trappe au niveau du "ill ref memory".
On gagne pas vraiment beaucoup de temps mais de la
place en particulier pour le compilateur qui macro-genere
tous les CONS. Et pis ca fait tres riche de ne pas tester
la fin des listes libres comme si yen avait toujours ...
La fonction IMPLODE a ete ameliore : si son argument
est une chaine, elle utilise ls caracteres de cette chaine
ex : (IMPLODE (CONCAT "[" "A B . C" "]")) -> (MCONS A B C)
Les erreurs lectures sont plus causantes :
ya des numeros d'erreur (he oui!).
Le message est donc maintenant :
** READ error : <n> avec <n> :
1: une S-expr commence par un .
2: " " " par une )
3: " " " par un ]
4: ya un . au plein milieu d'une liste
5: ya qchose du type ( xx yy . zz ]
6: un ] sans [ correspondant
7: une ) sans ( correspondante
8: y pas assez de caracteres pour IMPLODE
9: on a donne du n'importe quoi a IMPLODE
1-Sep-78 [JER]
2 nouvelles fonctions systemes (pour changer un peu).
- (PATCH adress valeur) permet de modifier soi-meme
le HIGH-SEG de VLISP.
- (TMPCOR <nom>) lit un fichier TMPCOR de nom specifie.
Ce nouveau truc sert a SYS:VLISP.INI pour charger -APRES-
votre VLISP.INI, le dernier fichier .VLI qui a ete
utilise par l'editeur.
En resume L'INITIALISATION de VLISP s'opere comme suit :
1) lecture sur la partition de l'utilisateur du fichier
CONFIG.INI (le 1er argument de cette fonction doit etre
de preference '(SYS (VLISP . INI)) pour faire la suite.
2) lecture sur la partition systeme su fichier VLISP.INI.
Ce fichier imprime ensuite : la version de l'interprete,
la date, l'heure et votre PPN; puis edite :
SYS:VLISP.INI loaded.
3) lecture (s'il existe) du fichier VLISP.INI sur VOTRE
partition. Le chargemnt de ce fichier se fait en silence
(i.e. sans rien imprimer) mais ca utilise la fonction
INPUT (i.e. vous pouvez mettre des appels de chargement
de file LIBRARY la-dedans). Apres cette lecture ca imprime :
DSK:VLISP.INI loaded.
4) puis si le dernier fichier utilise sous ETV a pour
extension .VLI, ce fichier est lu de la meme maniere
qu'au 3). Apres cette lecture ca imprime :
DSK:file.VLI loaded.
5) et apres tout ca, on ecoute la TTY...
Toutes ces belles choses sont executees par le
dernier PROGN du fichier SYS:VLISP.INI
29-Aout-78 [PAT]
- La macro d'entree [ ... ] a ete generalisee un tant soit peu.
En voici la substance:
[x1 x2 ... xn] donne comme d'habitude (LIST x1 x2 ... xn).
[x] donne (NCONS x), pretendument plus rapide.
[x1 x2 ... xn . y]
donne (MCONS x1 x2 ... xn y).
[x . y] donne (CONS x y).
L'idee de cette generalisation est que:
Il y a des listes pointees QUOTEES, ex. '(A B . C).
Il y a donc aussi des listes pointees EVALUABLES,
ex. [A B . C].
VLISP, encore gagnant, retablit une symetrie que les LISPs
anterieurs avaient laissee bien compromise.
27-Aout-78 [JER]
- Toutes les fonctions sur P-listes ramenent toujours NIL si leurs
premier argument est un nombre ou une chaine.
- Nouvelle fonction ETRACE pour faciliter les TRACE et les STEP
(ETRACE <s>) == (PROGN (STATUS 1 3) (EPROGN <s>) (STATUS 2 3))
- la fonction DMC supporte une chaine en 1er argument.
- la fonction (STATUS 39) est debuggee ...
26-Aout-78 [JER]
- Nouvelles fonctions systeme :
SHOWIT FILOP
- Nouvelles fonctions sur les nombres :
EQN NEQN = # > >= < <= FIXP FLOATP
Pour la documentation sur ces dernieres fonctions,
voir le chapitre du manuel qui cause des nombres :
DSKM:NUMBER.MAN[LIS,JER]
- Il existe maintenant un fichier VLISP.INI sur le disque
systeme. Il est possible de le lire a la place du VLISP.INI
qui se trouve sur votre partition en changeant sur votre
fichier CONFIG.INI le 1er argument de la fonction CONFIGURATION
de la maniere suivante :
a la place de '(DSK (VLISP . INI)) == '(SYS (VLISP . INI))
En fin de lecture du SYS:VLISP.INI, une tentative de lecture
du fichier VLISP.INI est faite ce qui permet d'avoir son
propre fichier initial sur sa partition disque.
24-Aout-78 [JER]
Nouvelles fonctions systemes :
CALLI GETPPN PJOB SWITCH LIGHTS GETTAB RUNTIME DAYTIME.
L'entree des nbs avec une base puissance de 2 a ete
refaite en utilisant des decalages dans le HORNER.
18-Aout-78 [JER]
Le nouveau super-hack POUR.
Il existe une nouvelle fonction POUR qui possede
la definition suivante :
(DF POUR (L)
(IF (EQ (CAR L) 'EVAL)
(EPROGN (CDR L))
() ))
Elle ne fait donc qu'evaluer le reste des args si le
1er est (justement) EVAL.
ex : (POUR EVAL (PRINT "Le trait POUR est present"))
-> "Le trait POUR est present")
? (POUR ALPHONSE (GLUCKP "Fonce Alphonse"))
-> NIL
-------- [PAT] ------------------------------------------------
| En effet ALPHONSE, absent, n'a donc aucune raison
| d'evaluer l'appel de GLUCKP.
| Mais si j'ecris un programme avalant des s-expressions,
| et que dans ma boucle de lecture, je place quelque chose comme
| (SELECTQ (CAR lu)
| ...
| (POUR (IF (EQ (CADR lu) 'ALPHONSE) (EPROGN (CDDR lu))))
| ...)
| Tout ce qui suit ALPHONSE dans le truc lu sera eprogne.
| Mais si je lis une s-expression POUR telle que, par exemple:
| (POUR PRETTY ...)
| il n'en sera tenu nul compte. En revanche, PRETTY similairement
| preparee au trait-POUR dans sa propre boucle de lecture, ne
| manquera pas d'y reagir. C'est dans l'alterite du sujet que
| le POUR s'oblitere.
|----------------------------------------------------------------
Cette fonction permet de communiquer certaines
S-expr a certains programmes sans gener les autres.
Les programmes trappants sont d'ordinaire les utilitaires
traitant des fichiers.
Par exemple le PRETTY-PRINT traite dans la boucle de
lecture du fichier d'entree les "POUR PRETTY" de la
maniere suivante :
... (SETQ lu (READ))
(COND ((ATOM lu) (PRIN1 lu))
((AND (EQ (CAR lu) 'POUR) (EQ (CADR lu) 'PRETTY))
(EPROGN (CDDR lu)))
...
18-Aout-78 [JER]
De nouvelles fonctions : APPLYN PROG1 PROG2 EXCH OUTBUF
17-Aout-78 [JER]
L'erreur ** arithmetic exception apparait desormais
en cas de debordement d'entier ou de flottant ou en
cas de division par 0.
Un second chapitre du manuel est disponible :
DSKB:NUMBER.DOC[LIS,JER]
16-Aout-78 [PAT]
Une nouvelle fonction tres sophistiquee : LIT .
(P. GREU)
Elle se prononce (car c'est une SUBR a 3 arguments)
(LIT <une-liste-L> <une-chose-E> <une-fonc-F>)
Si L = NIL ramene E
Sinon L = (X1 X2 ... XN)
On ramene alors
(F X1 (F X2 ... (F XN E) ... ))
15-Aout-78 [JER]
Le traitement des co-post-recs a l'air de correctement
fonctionner ... enfin l'HISTOIRE jugera.
Le nouveau manuel VLISP 10 . 3 est en cours de realisation
les chapitres termines seront annonces.
Ils sont tous nommes : DSKM:xxxxxx.DOC[LIS,JER]
Le 1er termine est PRETTY.DOC.
15-Aout-78 [PAT]
Les DE, DF, DM, ... peuvent desormais etre ecrites en
"call-form" i.e. "ressembler" a leurs appels.
Forme generale:
(Dx (le-nom . la-liste-d'agruments) . le-corps)
Exemples:
(DE (FOO X Y) ... ) pour (DE FOO (X Y) ...)
(DF (FOO . X) ... ) pour (DE FOO X ... )
Les anciennes formes de definition sont evidemment
toujours valides.
15-Aout-78 [PAT]
Nouvelle fonction: la SUBR SUBLIS bien connue.
Elle utilise ASSQ.
14-Aout-78 [JER]
Le depart a chaud fonctionne enfin. Il permet donc
de garder des images de l'interprete entier avec
des tas de fichiers compiles dedans ....
Ex: je veux creer une image memoire du
PRETTY-PRINT compile :
1) on compile sur disque.
.R VLISP
....
(COMPILEF PRETTY T)
2) on charge avec un LISP frais
(pour gagner la place du compilo).
.R VLISP
...
(LAPF PRETTY) ; on charge ;
...
(LAPEND) ; on recupere la place du LAP ;
puis on interrompt avec ↑C et on sauve avec la commande :
.NSAVE PRETTY 50k
pretty saved
.RUN PRETTY ; pour executer l'image ainsi fabriquee.
Ca marche bien mais le fichier executable resultant
d'extension .EXE est tujours tres gros. Il faut donc
calculer AU PLUS JUSTE la configuration initiale
du fichier dont on veut faire l'image....
13-Aout-78 [PAT]
Ya un nouvel INDEXEUR : il est sur DSK:INDEX.VLI[LIS,PAT]
Il est normalement AUTOLOAD et il s'appelle au moyen de :
(INDEXF <file>) ou (INDEFILE <filout> <filin>)
11-Aout-78 [JER]
Ya un CROSS REFERENCE possible dans le PRETTY.PRINT
Ca s'appelle :
(CROSSF nom du fichier) ou (CROSSFILE filout filin)
5-Aout-78 [JER]
Une nouvelle organisation de la pile (en particulier
un nouveau format des LAMBDA-FRAME construits par
EVAL, a ete concu et implemente pour pouvoir
traiter correctement les appels de fonctions
co-post-recursives. Ce type d'appel est correctement traite
a partir de la version VLISP 10.3-15.
31-Jul-78 [JER]
Nouvelle fonction VERSION qui ramene le numero de
la version de l'interprete (cette fonction est utilisee
par le chargeur et le compilateur pour s'assurer que
le code genere correspond bien aux possibilites actuelles
du compilateur.).
Le depart a chaud a ete implemente il permet
de se creer des images prives de l'interprete dans
lequel ont ete charges des fichier compiles.
28-Jul-78 [JER]
Rajoute le IT feature. from [PAT]
Rajoute la fonction ALIAS.
24-Jun-78 [JER]
Petit nettoyage : rajout des fonctions C....R.
Correction du BUG dans les conversions des PPNs.
6-Jun-78 [JER]
L'interprete a ete ameliore en ce sens qu'a l'appel
des EXPRs, il n'y a plus d'appel a EVLIS. Les appels
tail-recursifs sont toujours correctement traites.
28-mar-78 [JER]
Un ensemble de fonctions permettant de sortir
directement sur les DACs est en cours de mise-au-
point. Toutes les suggestions sont les bienvenues.
22-mar-78 [JER]
Un nouvel ensemble de fonctions permettent de
travailler sur les ecrans en controlant les editions.
Voir les fonctions PPIOT UPGIOT et CALLI.
1-mar-78 [JER]
Certaines erreurs LISP ne snt plus fatales car le
systeme appelle aautomatiquement des fonctions
standards d'ereurs, qui sont redefinissables a
volonte (cf : ERROR.UBV ERROR.UDFE ERROR.UDFA)
17-fev-78 [JER]
Une nouvelle version du systeme VLISP 10 . 3
est en cours d'ecriture a l'IRCAM. Toutes les
nouveautes par rapport a l'ancienne version
VLISP 10 . 2 ainsi que son mode d'utilisation
seront decrites au fur et a mesure dans ce
fichier, en attendant la brochure definitive.
Nouvelles fonctions standards (par ordre alphabetique) :
ces fonctions n'apparaissent dans aucunes des documentations
actuelles de VLISP-10.
********
C....R
CYCLE
DMC
DO
IMPLODE
IRCAMP
LIT
LOGAND
LOGOR
LOGSHIFT
LOGXOR
PRINTLENGTH
PRINTLEVEL
PSTACK
RPLACB
SELF
SUBLIS
********
(C....R) [SUBRs a 1 argument]
selecteurs a 4 niveaux : ex CADDAR, CDDDDR ...
(CYCLE) [SUBR a 0 argument]
permet de recommencer une boucle DO (voir cette fonction)
a l'endroit de modification puis test des variables
de controle (i.e. en fin de corps de DO).
(DMC caractere larg ... corps ...) [FSUBR]
permet de definir (ou de redefinir) un macro-caractere.
Cette fonction est equivalente a l'appel :
(STATUS 18 'caractere (MCONS 'LAMBDA larg ... corps ...)
et est donc plus aisee a utiliser.
ex: (DMC /⊂ () ['PRETTY (READ)])
Il est maintenant possible de PRETTY-PRINTER ce type
de fonction au moyen de la fonction standard PRETTY
ex: (PRETTY /⊂)
-> (DMC /⊂ () ['PRETTY (READ)])
(DO ((var1 init1 rep1) ... (varN initN repN))
( pred e1 ... eN)
corps du DO )
C'est le DO MACLISP generalise. Voir MOON
(IMPLODE l) [SUBR a 1 argument]
La liste l est une liste de caracteres (atome litteraux
mono-caractere, nombres entiers ou chaines de 1 caractere).
IMPLODE (parfois appellee READLIST) va creer un objet
LISP dont la representation externe est cette liste de
caracteres. C'est donc une sorte de GENSYM ou de PACK.
Cette fonction a l'enorme avantage d'utiliser le vrai
fonction READ ce qui permet des choses du genre :
(IMPLODE '(A B C 4 "z" Q)) -> ABC4zQ
(IMPLODE '( 1 2 4 /. 5 6 )) -> 124.56
(IMPLODE '( /( A /. B /) )) -> (A . B)
(IMPLODE '( /' /( A B C /) )) -> '(A B C)
Cette fonction permet donc de creer n'importe quel
objet LISP (et non pas que des atomes litteraux).
Le message IMPLODE error, apparait en lieu et place
de l'erreur READ error.
(IRCAMP) [SUBR a 0 argument]
est un predicat qui est vrai si l'interprete se trouve
a l'IRCAM (i.e. si les terminaux sont des DATA MEDIAs)
(LIT l e f) [SUBR a 3 agruments]
avec
l = (X1 X2 ... XN)
e = quelque chose
f = une fonction a 2 agruments
Ramene E si l = NIL
Ramene (F X1 (F X2 ... (F XN E) ... )) sinon.
LIT permet d'ecrire des definitions tres elegantes
et concises.
Exemples 1:
(APPEND X Y) = (LIT X Y 'CONS)
(MAPCAR L F) = (LIT L NIL (LAMBDA (X Y) (CONS (F X) Y)))
Exemples 2:
(POWERSET '(A B C))
-> ((A B C) (A B) (A C) (A) (B C) (B) (C) ())
avec
(DE POWERSET (L) (LIT L [NIL] 'FOO))
(DE FOO (A B) (LIT B B 'BAR))
(DE BAR (C D) (CONS (CONS A C) D))
(PROCAR '((A B) (C D E) (F G))
-> ((A C F) (A C G) (A D F) ... (B E G))
avec
(DE PROCAR (L) (LIT L [NIL] 'FOO)
(DE FOO (A B) (LIT A NIL 'BAR))
(DE BAR (C D) (LIT B D 'HACK))
(DE HACK (E F) (CONS (CONS C E) F))
(LOGAND n1 n2) [SUBR a 2 arguments]
Effectue l'operation de ET logique entre les deux operandes
qui doivent etre de type entier.
(LOGAND n1 n2) et equivalent a l'ancienne ecrirture :
(BOOLE 6 n1 n2)
(LOGOR n1 n2) [SUBR a 2 arguments]
Effectue l'operation de OU logique entre les deux operandes
qui doivent etre de type entier.
(LOGOR n1 n2) est equivalnt a l'ancienne ecriture :
(BOOLE 8 n1 n2)
(LOGSHIFT n1 n2) [SUBR a 2 arguments]
Effectue un decalage logique de la valeur n1, n2 fois.
Si n2 est >0 un decalage gauche s'effectue, dans le cas
contraire (n2 < 0), le decalage s'effectue a droite.
(LOGXOR n1 n2) [SUBR a 2 arguments]
Effectue l'operation de OU exclusif logique entre les deux
operandes qui doivent etre de type entier.
(LOGXOR n1 n2) et equivalent a l'ancienne ecriture :
(LOGAND n1 n2) [SUBR a 2 arguments]
Effectue l'operation de ET logique entre les deux operandes
qui doivent etre de type entier.
(LOGAND n1 n2) et equivalent a l'ancienne ecrirture :
(BOOLE 6 n1 n2)
(LOGOR n1 n2) [SUBR a 2 arguments]
Effectue l'operation de OU logique entre les deux operandes
qui doivent etre de type entier.
(LOGOR n1 n2) est equivalnt a l'ancienne ecriture :
(BOOLE 8 n1 n2)
(LOGSHIFT n1 n2) [SUBR a 2 arguments]
Effectue un decalage logique de la valeur n1, n2 fois.
Si n2 est >0 un decalage gauche s'effectue, dans le cas
contraire (n2 < 0), le decalage s'effectue a droite.
(LOGXOR n1 n2) [SUBR a 2 arguments]
Effectue l'operation de OU exclusif logique entre les deux
operandes qui doivent etre de type entier.
(LOGXOR n1 n2) et equivalent a l'ancienne ecriture :
(BOOLE 9 n1 n2)
(PRINTLENGTH n) [SUBR a 1 argument]
Permet de specifier le nombre maximum d'elements des listes
qui sera imprime lors des PRIN1 et PRINT. Par defaut ce nombre
est de 2000. Si une liste a un nombre d'elements plus eleve,
le rste des elements ne sera pas imprime et des points
de suspension apparaitront devant la parenthse fermante.
Cette fonction est utilisee pour imprimer de maniere concise
des listes parfois tres longues ...
PRINTLENGTH ramene en valeur la longeur maximum courante.
(PRINTLEVEL n) [SUBR a 1 argument]
Permet de specifier la profondeur maxomum d'impression,
i.e. le nombre maximum de parentheses ouvrantes. Comme
PRINTLENGTH cette fonction permet d'imprimer des
structures de maniere concise. La valeur par defaut
de PRINTLEVEL est de 50.
Ces deux fonctions ont en outre la vertu d'eviter
de faire boucler les fonctions d'impression PRIN1 et PRINT
dans le cas de listes circulaires.
(PSTACK [n]) [SUBR a 1 arg optionnel]
Si n est fourni, c'est la nouvelle valeur a affecter au
pointeur de pile systeme.
(RPLACB l1 l2) [SUBR a 2 arguments]
est equivalente a :
(PROGN (RPLACA L1 (CAR L2))
(RPLACB L1 (CDR L2)))
I.e. que l'on remplace L1 par L2 (comme avec (SETQ L1 L2)
mais en gardant la meme adresse physique pour le 1er doublet
de L1. Cette fonction est principalement utilisee dans les
MACROS qui operent des modifications physiques des fonctions.
(SELF e1 ... eN) [SUBR a N arguments]
Applique a la derniere lambda-expression utilisee les
differents arguements e1 ... eN evalues. Cette fonction,
imaginee par P. Greussay, permet de decrire des lambda-
expressions explicites recursives, sans utiliser la
forme archaique LABEL.
Si cette fonction est utilisee en dehors d'une lambda
i.e. au top-level, l'erreur suivante apparait :
** SELF error.
ex :
((λ (N) (IF (=0 N) 1 (* N (SELF (1- N))))) 5) -> 120
(SUBLIS une-a-liste une-s-expression) [SUBR a 2 agruments]
Pour toutes les occurences dans s-expr de CAR's des
paires pointees de la a-liste, substitue les CDR's
correspondants.
Ex:
(SUBLIS '((A . 1) (B 2 3)) '(A (B C) D B . B)))
-> (1 ((2 3) C) D (2 3) 2 3)
La definition en VLISP est:
(DE SUBLIS (A E)
(LET ((E E))
(IF (ATOM E) (LET ((X (ASSQ E A)))
(IF X (CDR X) E))
(CONS (SELF (NEXTL E)) (SELF E)))))
Nouvelles fonctions systeme (par ordre alpha)
*********
ALIAS
DATE
RUN
TIME
VERSION
*********
(ALIAS ppn) [SUBR a 1 argument]
a le meme effet que la commande moniteur IRCAM : ALIAS.
Si ppn=NIL, le ppn du LOGIN est utilise. Si ce n'est
pas la version IRCAM, ALIAS ne fait rien.
ALIAS ramene le PPN courant.
(DATE) [SUBR a 0 argument]
ramene l'atome representant la date du jour sous la forme:
jj-mmm-aa
(RUN filspec offset) [SUBR a 2 arguments]
sort de VLISP et joue le programme dont le nom est
specifie dans filespec. L'offset est rajoute a l'adresse
de lancement du programme (en general offset = NIL).
Attention RUN effectue un aller simple!
ex : (RUN '(SYS (E . SHR))) va jouer le programme E.
(RUN '(SYS (E . SHR)) -1) va jouer E en utilisant
le meme fichier qu'au dernier appel de E
(RUN '(SYS (ADV . EXE))) vous voici a l'aventure.
(TIME) [SUBR a 0 argument]
ramene l'heure courante sous la forme : hh:mm:ss
(VERSION) [SUBR a 0 argument]
ramene le numero de version de l'interprete utilise.
Fonctions standards qui utilisent la TTY
********
DISPLAY
PPIOT
SETACTABLE
TRMOP
TYI
TYO
TYS
UPGIOT
********
(DISPLAY liste nb) [SUBRN a 2 arguments]
Cette fonction est identique a la fonction UPGIOT
avec les arguments inverses. DISPLAY est plus pratique
car le 1er argument n'etait jamais utilise, et est
plus facile a se rappeller.
ex: (DE BEEP () ; pour faire sonner son terminal ;
(DISPLAY '(\177 7)))
(PPIOT no val) [SUBR a 2 arguments]
Appelle l'UUO IRCAM PPIOT avec no comme AC filed, et
val comme AE field. Tous les renseignements utiles
d'utilisation de cette fonction se trouvent naturellement
dans la brochure "the IRCAM/STANDFORD Monitor".
Cette fonction permet d'utiliser les "Page of Paper"
des terminaux DATA-MEDIAS.
ATTENTION : cette fonction a tendance a faire crasher le
systeme en cas de mauvais emploi. I vaut mieux eviter.
La principale fonction est :
(PPIOT 0 n) qui permet de selecter la Page-of-Paper de
numero specifie.
(SETACTABLE ln) [SUBR a 1agument]
Met a jour la table d'activation des caracteres de la TTY
en DM mode. Ramene la nouvelle table d'activation.
ln doit etre une liste de 4 nombres qui sont codes
conformement a la brochure (c'est d'un clair tout ca!).
Voir SETACT UUO in IRCAM/STANDFORD monitor.
Cette fonction doit etre utilisee pour creer des
acros-caracteres a action immediate : les DMCI.
(TRMOP fnt index valer) [SUBR a 3 arguments]
Cette fonction permet d'utiliser l'UUO TRMOP.
Permet de changer les caracteristiques de la TTY sur
laquelle on travaille (voir les brochures Monitor Calls
et Std/Irc Monitor).
(TYI) [SUBR a 0 argument]
Ramene le code interne du caractere suivant lu sur la
TTY sans aucune conversion et sans avoir a taper de return.
I.e. que l'action de TYI est immediate pour 1 caractere
frappe. Cette fonction doit etre utilisee dans tous
les systemes un peu conversationnels ...
(TYO n) [SUBR a 1 argument]
Imprime sur la TTY le caractere de code interne n. L'action
de cette fonction est immediate. Il n'est helas pas possible
d'envoyer avec cette fonction les caracteres speciaux de
positionnement des DATA-MEDIAS (car ils sont filtres au niveau
du handler TTY) pour pourvoir faire ca, i fo utiliser la
nouvelle fonction UPGIOT.
(TYS) [SUBR a 0 argument]
Ramene le code interne du caractere tape ou NIL si
aucun caractere n'a ete tape. Ca rentre tout de suite.
(UPGIOT f l) [SUBR a 2 arguments]
Edite sur la TTY la liste de codes internes l avec les flags l.
C'est du bon systeme ... Pour plus ample renseignements voir
brochure "The IRCAM/STANDFORD Monitor" par B. Harvey &
M. Frost qui decrit l'UUO UPGIOT. Cette UUO permet d'envoyer
sur les DATA-MEDIAs des caracteres de positionnement ...
Il est preferable d'utiliser dorenavant la fonction
DISPLAY en lieu et place de UPGIOT.
ex : Cette fonction ecrit sur la Xieme ligne et a la Yeme
colonne la chaine de caracteres S.
(DE OUTXYS ( X ;lig; Y ;col; S ;chaine;)
(UPGIOT ()
(APPEND [\177 \14 (LOGXOR \140 Y) (LOGXOR \140 X)]
(MAPCAR (MAKLIST S) 'CASCII))))
(OUTXYS 2 30 "Message a editer sur la 3eme WHO LINE...")
De nombreux exemples d'utilisation sont ecrits dans le
fichier : TTY.VLI[LIS,JER]
Vous y trouverez en particulier un programme "artistique"
en evaluant (TTYTEST) et un jeu de CONWAY en evaluant
(CONWAY).
2 REMARQUABLES demonstrations sont disponibles :
- les tours de HANOI :
HANOI.VLI[LIS,JER]
- AZERTUIOP et son pere :
AZER.VLI[LIS,PAT]
Fonctions qui utilisent le DAC
**********
DACCHN n (0 1 2 ou 4)
DACFIL 4000 10000
DACOUT nb
DACRAT 10000
DACS adresse val
DACSET -1
**********
Ya un test qui fonctionne sur DAC.VLI[LIS,JER]
L'utilisation actuelle est peu recommandee car elle bloque
le time-sharing....
Modifications
Ya pas a priori de modifications qui obligent a corriger
de l'ancien code.
**********
La fonction TOPLEVEL standard stocke dans l'atome IT
la valeur retournee par l'evaluation. Ceet atome
fait donc office de resultat intermediaire qui peut
etre reutilise :
EX: (* 2 10)
= 20
? (* IT 3)
= 60
? (// IT 6)
= 10 ...
**********
----- Une nouveaute PATRICK GREUSSAY -----
Il n'est plus necessaire de quoter les lambdas-expressions
explicites dans les fonctionnelles.
ex : (MAPC L (LAMBDA (X) ... )) remplace avantageusement
(MAPC L (QUOTE (LAMBDA (X) ... )))
**********
La fonction LIBRARY emet les diagnostiques :
** LIBRARY error : <file>
si on essaie de lire le fichier LIBRARY <file> a l'interieur d'un
autre fichier LIBRARY.
** READ error (in LIBRARY).
a l'occurence d'une erreur dans le READ d'un fichier LIBRARY.
**********
Les Entrees/Sorties ont (encore) subies beaucoup de transformations
en particulier pour ce qui est du terminal :
- de nouvelles fonctions sont disponibles TYI TYO UPGIOT PPIOT
- un renfoncement automatique, sur entree TTY, a lieu
automatiquement. On peut desormais pretty-printer tres
facilement ses fonctions en entree (c'est tres simple a
faire mais c'est bien utile ...)
- les diagnostiques des erreurs de lecture sont plus explicite en ce
sens qu'on peut distinguer le manque de parenthses fermantes
d'une erreur de . ou de [] .
- le bit 19 du RG permet d'arreter le transcodage minuscule
majuscule a la lecture. Si (STATUS 1 19) la traduction a lieu
et c'est le cas standard; si (STATUS 2 19) les cases ont une
importance. Ce nouveau trait est dorenavant utilise dans le
PRETTY-PRINT qui restitue les cases originelles.
Recuperation des Erreurs LISP
A L'apparition de certaines erreurs, LISP appelle desormais
des fonctions standards (qui peuvent etre redefinies). La valeur de
ces fonctions devient la valeur de la forme qui avait provoquee
l'erreur. Ce nouveau trait a ete ajoute pour permettre
l'introduction de dispositifs speciaux de traitement des
erreurs (pas vrai Harald!).
Ces fonctions ont ete introduites dans les fichiers initiaux
en particulier sur : VLISP.INI[LIS,JER]
Dans le cas ou on ne desire pas redefinir ce genre de fonctions,
LISP ecrit en plus des messages d'erreurs standards 2 nouvelles
informations :
--- last forme = "le derniere forme evaluee par EVAL"
--- last fnt = "la derniere lambda-expresssion evaluee"
Variable undefinie :
a l'apparition de cette erreur, la fonction ERROR.UBV
est appliquee avec comme argument:
- le nom de l'atome undefini
- le pointeur de pile courant
- le pointeur des liens dans la pile P$BIND
(ce pointeur permet de recuperer la derniere lambda
expression utilisee).
ex :
(DE ERROR.UBV (ATOME PILE P$BIND)
(PRINT "Variable undefinie : " ATOME)
(PRINT "Je lui donne la valeur NIL")
NIL))
Fonction undefinie dans EVAL :
A l'apparition de cette erreur, la fonction ERROR.UDFE est
appliquee avec comme argument :
- la fonction undefinie
- la forme qui etait en cours d'evaluation
- le pointeur courant sur la pile
- le pointeur des liens dans la pile P$BIND
(voir la remarque precedente)
Fonction undefinie dans APPLY :
A l'apparition de cette erreur, la fonction ERROR.UDFA est
appliquee avec les memes arguments que ERROR.UDFE.
;;; ex de definition des traps erreurs ;;;
(DE ERROR.UBV (ATOME PILE P$BIND)
(PRINT "Variable undefinie : " ATOME)
(OR (ZEROP P$BIND) ; si P$BIND = NIL yavait pas de λ en cours ;
(PROGN
(PRINTLEVEL 6) ; des fois les fnts sont trop longues ;
(PRINTLENGTH 10) ; dito ;
(PRINT "La derniere λ etait : "
; cet horrible HACK recupere dans la pile la λ ;
(VAG (STATUS 41 (ADD1 (LOGAND P$BIND \777777)))))
(PRINTLEVEL 50) ; restaure les valeurs courantes ;
(PRINTLENGTH 2000)))
(RESET) ; pour rentrer gentillemennt sus LISP ;)
(DE ERROR.UDFE (FNT FORME PILE P$BIND)
; Undefined function EVAL ;
(ERROR.UDF "Fonction undefinie dans EVAL : "))
(DE ERROR.UDFA (FNT FORME PILE P$BIND)
; Undefined function APPLY ;
(ERROR.UDF "Fonction undefinie dans APPLY : "))
(DE ERROR.UDF (MSG)
; Fonction generale d'erreur FUNCTION UNDEFINED ;
(PRINT MSG FNT)
(PRINTLEVEL 6)
(PRINTLENGTH 10)
(PRINT "La derniere forme etait : " FORME)
(OR (ZEROP P$BIND)
(PRINT "La derniere λ etait : "
(VAG (STATUS 41 (ADD1 (LOGAND P$BIND \777777))))))
(PRINTLEVEL 50)
(PRINTLENGTH 2000)
(RESET))
Interruptions
L'interruption "ESCAPE I" a ete introduite; elle permet d'interrompre
l'execution d'un programme LISP, d'executer un autre programe LISP,
et de revenir au programme interrompu.
Cette interruption est provoquee par l'envoie d'un code special
sur la TTY : le ESCAPE-I qui se frappe : NUL puis I ou bien
NUL puis une suite de digits decimaux puis I.
A l'apparition d'une interruption de ce type, LISP lance
une fonction de nom ESCAPE.I avec pour arguments :
1 - le nombre tape entre NUL et I (i.e. le numero du ESCAPE-I)
2 - le pointeur de pile lui-meme
3 - le pointeur des BINDs dans le pile (P$BIND)
Ces arguments permettent toutes les manipulations au niveau
de la pile (en particulier les restaurations de contextes et
de pile) de la meme maniere que les erreurs LISP.
Cette fonction d'une facon standard imprime le libelle :
** ESCAPE-I : argument numerique
puis retourne au programme interrompu.
Il est tout-a-fait possible de redefinir cette fonction pour
gerer par soi meme ce type d'interruption.
Un exemle d'utilisation de cette fonction se trouve dans
le fichier ESCAPI.VLI[LIS,JER]
Cette fonction est definie en general dans les fichiers
VLISP.INI de la maniere suivante :
(DE ESCAPE.I (numero pile p$bind unbreak lu it)
(TERPRI)
(PRINT "Je rentre dans un TOPLEVEL ESCAPE-I.")
(PRINT "Pour en sortir, tape UNBREAK .")
(STATUS 11 '/!)
(SETQ unbreak)
(UNTIL unbreak
(SETQ lu (READ))
(IF (EQ lu 'unbreak) (SETQ unbreak T)
(SETQ it (PRINT (EVAL lu)))))
(STATUS 11 '/?)
(PRINT "Ca roule..."))
; Ce qui permet d'efectuer des BREAKS tres commodement ;
; Dans le meme genre d'idee ;
(DE ESCAPE.I (numero pile p$bind lu it)
(TERPRI)
(PRINT "Je rentre dans un TOPLEVEL ESCAPE-I.")
(PRINT "Pour en sortir, commence une ligne par <META-ESPACE>.")
(STATUS 11 '/!)
(TEREAD)
(UNTIL (EQ (PEEKCH) '/ )
(SETQ lu (READ))
(SETQ it (PRINT (EVAL lu))))
(STATUS 11 '/?)
(PRINT "Ca roule..."))
; le fonctionnement minimum consiste en : ;
(DE ESCAPE.I (N)
(INTERRUPT "Merci..."))
(DE TESTINT ()
(ESCAPE INTERRUPT
(PRINT "Interrompez-moi s.v.p.")
(WHILE T ())
; On utilise couramment cette interruptions avec des
fonctions d'echappement de type ESCAPE ;
(DE ESCAPE.I () (TERMIN <valeur a retourner>))
; et dans une fonction : ;
(ESCAPE termin
(WHILE T
...
))
; endroit ou l'on veut recevoir une valeur et revenir
a l'occurence d'une interruption ESCAPE.I ;
*** BUGS ***
Tous les bugs trouves a Vincennes
sur la version 2 ont ete
corriges.
les nouveaux :
- 28 mars 78
Un tres tres jouli BUG dans le Garbage-Collecting des
nombres flottants provoquait l'erreur ** no room for nbs
dans des cas inimaginables ... Le G.C. devrait fonctionner
normalement maintenant.
- 23 mars 78
La fonction DA ne permettait pas de declarer plus de
2 tableaux a la fois (c'etait pas beaucoup ...).
Maintenant on peut. Merci Daniel.